import pygame
from pygame.locals import *
import random
import sys
import time


class Food():
    def __init__(self, x, y):
        self.x = x * 20
        self.y = y * 20
        self.food_pos = [self.x, self.y]

    def display(self, screen):
        '''绘制食物'''
        pygame.draw.rect(screen, pygame.Color(0, 255, 0), Rect(self.x, self.y, 20, 20))


class MySnake():
    def __init__(self, x, y, direction='right'):
        self.x = x
        self.y = y
        self.direction = direction  # 方向

        # 设置蛇身
        self.snake_pos = [[self.x, self.y], [self.x - 20, self.y], [self.x - 40, self.y]]

    def display(self, screen):
        '''绘制蛇'''
        for pos in self.snake_pos:
            pygame.draw.rect(screen, pygame.Color(255, 0, 0), Rect(pos[0], pos[1], 20, 20))

    def move(self):
        '''蛇移动'''
        if self.direction == 'right':
            self.x += 20  # 向右移动
        if self.direction == 'left':
            self.x -= 20  # 向左移动
        if self.direction == 'up':
            self.y -= 20  # 向上移动
        if self.direction == 'down':
            self.y += 20  # 向下移动

        # 判断是否出界或者碰到自身
        if self.x > 520 or self.x < 0 or self.y > 580 or self.y < 0:  # 游戏出界
            print('游戏结束，出界了')
            return False
        elif [self.x, self.y] in self.snake_pos:
            print('游戏结束，碰到自身')
            return False
        # 把蛇头位置加到列表中
        self.snake_pos.insert(0, [self.x, self.y])
        print(self.snake_pos)
        return True


def Key_control(snake):
    '''键盘控制函数'''

    # 执行退出游戏操作
    for event in pygame.event.get():
        if event.type == QUIT:
            print('退出游戏')
            exit()

    # 获取按键信息
    press_keys = pygame.key.get_pressed()

    # 判断按键，执行对象的操作
    if press_keys[K_LEFT] or press_keys[K_a]:
        print('Left...')
        direction = 1
        # 移动方向不能相反，本来向右的，不能改为向左
        if snake.direction != 'right':
            snake.direction = 'left'


    elif press_keys[K_RIGHT] or press_keys[K_d]:
        print('Right...')
        direction = 0
        # 移动方向不能相反，本来向左的，不能改为向右
        if snake.direction != 'left':
            snake.direction = 'right'

    elif press_keys[K_UP] or press_keys[K_w]:
        print('up...')
        direction = 2
        # 移动方向不能相反，本来向下的，不能改为向上
        if snake.direction != 'down':
            snake.direction = 'up'

    elif press_keys[K_DOWN] or press_keys[K_s]:
        print('down...')
        direction = 3
        # 移动方向不能相反，本来向上的，不能改为向下
        if snake.direction != 'up':
            snake.direction = 'down'


def Main():
    '''主程序函数'''
    # 创建游戏窗口
    screen = pygame.display.set_mode((520, 580))
    # 创建蛇对象
    snake = MySnake(100, 100)  # 设置蛇的初始位置
    food = Food(8, 9)  # 设置食物的初始位置
    end = True
    num = 20  # 刷新时间
    speed = 0.3  # 移动速度（秒）
    score = 0  # 游戏分数
    while end:
        # 执行键盘控制
        Key_control(snake)

        if num == 20:  # 一秒钟刷新一次
            num = 0
            # 填充背景颜色
            screen.fill(pygame.Color(0, 0, 0))

            # 移动并检测是否结束游戏
            if not snake.move():
                # 游戏结束了
                end = False
                print('分数为：', score)
                continue

            # 判断是否吃到食物
            if snake.x == food.x and snake.y == food.y:
                # 食物被吃了，需要新建一个
                score += 1
                x = random.choice(range(26))
                y = random.choice(range(29))
                # 食物的坐标取随机数
                food = Food(x, y)
            else:
                snake.snake_pos.pop(-1)  # 删除列表的最后一个元素
                snake.display(screen)  # 画蛇
                food.display(screen)  # 画食物

            # 更新显示到屏幕表面
            pygame.display.update()

        else:
            num += 1

        # 定时显示
        time.sleep(speed / 20)


if __name__ == '__main__':
    Main()
